// appApi/request.js
// 使用uni.request替代axios以兼容小程序环 境

// 基础配置
const config = {
  baseURL: 'http://localhost:8080/app', // 后端接口基础路径
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
}

// 获取token的辅助函数
function getToken() {
  let token = ''
  try {
    // 优先使用uni-app的存储API
    if (typeof uni !== 'undefined') {
      token = uni.getStorageSync('token')
    } else if (typeof localStorage !== 'undefined') {
      token = localStorage.getItem('token')
    }
  } catch (e) {
    console.error('获取token失败:', e)
  }
  return token
}

// 处理401错误的辅助函数
function handle401Error() {
  try {
    // 使用uni-app的存储API以兼容小程序
    if (typeof uni !== 'undefined') {
      uni.removeStorageSync('token')
      uni.reLaunch({ url: '/minePages/login' })
    } else if (typeof localStorage !== 'undefined' && typeof window !== 'undefined') {
      localStorage.removeItem('token')
      window.location.href = '/login'
    }
  } catch (e) {
    console.error('处理401错误失败:', e)
  }
}

// 封装uni.request
function request(options = {}) {
  return new Promise((resolve, reject) => {
    // 合并配置
    const requestOptions = {
      ...config,
      ...options,
      url: options.url ? (options.url.startsWith('http') ? options.url : config.baseURL + options.url) : '',
      header: {
        ...config.headers,
        ...options.headers
      }
    }

    // 请求拦截器功能：添加token
    const token = getToken()
    if (token) {
      requestOptions.header.Authorization = `Bearer ${token}`
    }

    // 发送请求
    uni.request({
      ...requestOptions,
      success: (res) => {
        // 响应拦截器功能：统一处理响应
        let responseData = res.data;
        
        // 处理所有类型的响应，无论状态码是什么
        // 首先尝试处理content-type
        const contentType = res.header['content-type'] || res.header['Content-Type'];
        if (contentType && contentType.includes('text/plain') && typeof responseData === 'string') {
          try {
            // 尝试将文本内容解析为JSON
            responseData = JSON.parse(responseData);
            console.log('成功将text/plain响应解析为JSON:', responseData);
          } catch (parseError) {
            console.warn('无法解析text/plain响应为JSON，返回原始文本:', responseData);
            // 如果解析失败，创建一个包含错误信息的对象
            responseData = {
              code: res.statusCode,
              message: responseData || '服务器返回文本数据',
              originalText: responseData
            };
          }
        } else if (typeof responseData !== 'object' && responseData !== null) {
          // 如果响应数据不是对象，将其包装为对象
          responseData = {
            code: res.statusCode,
            message: String(responseData),
            originalData: responseData
          };
        }
        
        // 处理不同的状态码
        if (res.statusCode === 200) {
          // 对于200响应，直接返回数据
          resolve(responseData)
        } else if (res.statusCode === 401) {
          handle401Error()
          reject(new Error('未授权，请重新登录'))
        } else {
          // 对于其他错误状态码，不直接reject，而是返回包含错误信息的数据对象
          // 这样调用方可以决定如何处理这些错误
          console.warn(`请求返回非200状态码: ${res.statusCode}`, responseData);
          // 如果responseData已经是对象，但没有code字段，添加code字段
          if (typeof responseData === 'object' && responseData !== null && !responseData.code) {
            responseData.code = res.statusCode;
          }
          resolve(responseData);
        }
      },
      fail: (err) => {
        // 错误处理
        console.error('请求失败:', err)
        reject(err)
      },
      complete: () => {
        // 可以在这里添加加载状态管理等
      }
    })
  })
}

// 提供GET、POST、PUT、DELETE等方法
export default {
  get(url, params = {}, options = {}) {
    return request({
      ...options,
      url,
      method: 'GET',
      data: params
    })
  },
  
  post(url, data = {}, options = {}) {
    return request({
      ...options,
      url,
      method: 'POST',
      data
    })
  },
  
  put(url, data = {}, options = {}) {
    return request({
      ...options,
      url,
      method: 'PUT',
      data
    })
  },
  
  delete(url, params = {}, options = {}) {
    return request({
      ...options,
      url,
      method: 'DELETE',
      data: params
    })
  }
}